package com.nuoniu.sibanyun.service.erp;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nuoniu.sibanyun.entity.bo.*;
import com.nuoniu.sibanyun.entity.dto.*;
import com.nuoniu.sibanyun.entity.erp.ErpVoucherDesign;
import com.nuoniu.sibanyun.entity.erp.ErpVoucherTable;
import com.nuoniu.sibanyun.entity.erp.ErpVoucherType;
import com.nuoniu.sibanyun.entity.erp.barcode.ErpBarcodeMainInfo;
import com.nuoniu.sibanyun.entity.vo.VoucherReferenceVo;
import com.nuoniu.sibanyun.userThread.UserInfo;

import java.util.HashMap;
import java.util.List;

/**
 * <p>
 * 单据设计 服务类
 * </p>
 *
 * @author baiqiang
 * @since 2020-09-23
 */
public interface IErpVoucherDesignService extends IService<ErpVoucherDesign> {




    /**
     * 单据 动态 分页查询
     * @param dynamicVoucherDto
     * @return
     */
    Page<HashMap<String,Object>> voucherDynamicPage(DynamicVoucherDto dynamicVoucherDto);


    /**
     * 单据 动态查询 单据详情
     * @param dynamicVoucherDetailDto
     * @return
     */
    HashMap<String,Object> voucherDynamicById(DynamicVoucherDetailDto dynamicVoucherDetailDto);

    /**
     * 设置 更多层级 明细数据
     * @param details
     * @param voucherTypeCode
     * @param mainId
     */
    void setMoreDetails(List<HashMap<String, Object>> details,String voucherTypeCode,Integer mainId);

    /**
     * 查询 指定单据明细 记录
     * @param detailIds             单据明细ID
     * @param voucherDesignIds      单据设计ID
     * @param voucherTypeCode       单据唯一编码
     * @return
     */
    List<HashMap<String,Object>> getSpecifyFieldRecord(List<Integer> detailIds,List<Integer> voucherDesignIds,String voucherTypeCode);

    /**
     * 查询 指定单据明细 全记录
     * @param detailIds
     * @param voucherTypeCode
     * @return
     */
    List<ErpBarcodeMainInfo> listByVoucherTable(List<Integer> detailIds,String voucherTypeCode);

    /**
     * 计算 累计执行数量 情况（当前单据明细 数量 不超出 来源单据 剩余执行数量）
     * @param voucherMainBo
     * @param voucherDetailBoList
     * @param voucherSearchBo
     */
    void calculateSourceVoucher(VoucherMainBo voucherMainBo, List<VoucherDetailBo> voucherDetailBoList, VoucherSearchBo voucherSearchBo);

    /**
     * 计算 退货数量 情况
     * @param voucherMainRetBo
     * @param voucherDetailRetBoList
     * @param voucherSearchBo
     */
    void calculateRetQuantity(VoucherMainRetBo voucherMainRetBo, List<VoucherDetailRetBo> voucherDetailRetBoList, VoucherSearchBo voucherSearchBo);


    /**
     * 计算 累计开票数量 情况（当前单据明细 数量 不超出 来源单据 剩余开票数量）
     * @param voucherInvoiceMainBo
     * @param voucherInvoiceDetailBoList
     * @param voucherSearchBo
     */
    void calculateInvoiceVoucher(VoucherInvoiceMainBo voucherInvoiceMainBo, List<VoucherInvoiceDetailBo> voucherInvoiceDetailBoList, VoucherSearchBo voucherSearchBo);
    /**
     * 初始化 单据设置
     * @param accountId
     */
    void initDefErpVoucherDesign(UserInfo userInfo, Integer accountId);
    /**
     * 获取某个表单的 默认配置
     * @param source
     * @return
     */
    List<ErpVoucherDesign> getDefErpVoucherDesign(String source);

    /**
     * 单据设计 -- 新增 自定义字段
     * @param erpVoucherDesignAddDto
     */
    void addCustomField(ErpVoucherDesignAddDto erpVoucherDesignAddDto);

    /**
     * 单据设计 -- 新增引用属性
     * @param voucherReferenceVo
     */
    void addReferencePropertyField(VoucherReferenceVo voucherReferenceVo);

    /**
     *
     * @param code          字段编码
     * @param dataTab       页签（（表头 + 表尾）、明细）
     * @return
     */
    boolean isHaveCode(String code, String dataTab);

    /**
     * 批量修改 表单设计
     * @param erpDocumentDesignDtos
     */
    void batchUpdate(List<ErpVoucherDesignDto> erpDocumentDesignDtos);

    /**
     * 批量修改 表单设计(超级管理员权限)
     * @param erpDocumentDesignDtos
     */
    void batchSystemUpdate(List<ErpVoucherDesignDto> erpDocumentDesignDtos);

    /**
     * 获取某个表单的 当前配置
     * @param erpVoucherDesignSearchDto
     * @return
     */
    List<ErpVoucherDesign> getCurrentErpVoucherDesign(ErpVoucherDesignSearchDto erpVoucherDesignSearchDto);

    /**
     * 删除 自定义 单据字段
     * @param id
     */
    void deleteCustomField(Integer id);

    /**
     * 删除 系统 单据字段(超级管理员权限)
     * @param id
     */
    void deleteSystemField(Integer id);

    /**
     * 启用 系统 单据字段(超级管理员权限)
     * @param id
     */
    void enableSystemField(Integer id);


    /**
     * 禁用 系统 单据字段(超级管理员权限)
     * @param id
     */
    void disableSystemField(Integer id);

    /**
     * 更改 系统单据字段 状态(超级管理员权限)
     * @param id
     * @param status
     */
    void updateSystemFieldStatus(Integer id,Integer status);

    /**
     * 锁定 系统字段 (超级管理员权限)
     * @param erpVoucherDesignDto
     */
    void lockField(ErpVoucherDesignDto erpVoucherDesignDto);

    /**
     * 解锁 系统字段(超级管理员权限)
     * @param id
     */
    void unLockField(Integer id);


    /**
     * 通过单据唯一code查询 关联的引用属性
     * @param voucherCode
     * @return
     */
    List<VoucherReferenceVo> listByReferenceTableCode(String voucherCode);





    /**
     * 转换T+ 单据设置 字段
     */
    void initDataFromSqlServer();

    void ansyncFun(List<ErpVoucherType> erpVoucherTypeList);


}
